package api

import (
	"singo/serializer"
	"singo/service"

	"github.com/gin-contrib/sessions"
	"github.com/gin-gonic/gin"
)

// UserRegister 用户注册接口
// @Summary 用户注册
// @Router /api/v1/user/register [post]
// @tags 用户相关
// @accept application/json
// @Param nickname query string true "用户昵称"
// @Param user_name query string true "用户名"
// @Param password query string true "密码"
// @Param password_confirm query string true "确认密码""
// @Param user_type query int true "用户类型 1超级管理员2管理员3普通用户"
// @Param gender query int false "性别 1男2女0未知" default(0)
// @Param organization query string false "组织"
// @Param job query string false "岗位"
// @Param rank query int false "职位"
// @Param level query int false "等级"
// @Success 200 {string} json "{"status": 0, "data": {}, "msg": ""}"
func UserRegister(c *gin.Context) {
	var service service.UserRegisterService
	if err := c.ShouldBind(&service); err == nil {
		res := service.Register()
		c.JSON(200, res)
	} else {
		c.JSON(200, ErrorResponse(err))
	}
}

// UserUpdate 用户修改接口
// @Summary 用户修改
// @Router /api/v1/user/resetPassword [put]
// @tags 用户相关
// @accept application/json
// @Param nickname query string true "用户昵称"
// @Param user_name query string true "用户名"
// @Param password query string true "密码"
// @Param password_confirm query string true "确认密码""
// @Param gender query int false "性别 1男2女0未知" default(0)
// @Param organization query string false "组织"
// @Param job query string false "岗位"
// @Param rank query int false "职位"
// @Param level query int false "等级"
// @Success 200 {string} json "{"status": 0, "data": {}, "msg": ""}"
func UserUpdate(c *gin.Context) {
	var service service.UserUpdateService
	if err := c.ShouldBind(&service); err == nil {
		res := service.Update()
		c.JSON(200, res)
	} else {
		c.JSON(200, ErrorResponse(err))
	}
}

// ChangePassword 用户修改密码接口
// @Summary 用户修改密码
// @Router /api/v1/user/resetPassword [put]
// @tags 用户相关
// @accept application/json
// @Param nickname query string true "用户昵称"
// @Param user_name query string true "用户名"
// @Param password query string true "密码"
// @Param password_confirm query string true "确认密码""
// @Param gender query int false "性别 1男2女0未知" default(0)
// @Param organization query string false "组织"
// @Param job query string false "岗位"
// @Param rank query int false "职位"
// @Param level query int false "等级"
// @Success 200 {string} json "{"status": 0, "data": {}, "msg": ""}"
func ChangePassword(c *gin.Context) {
	var service service.UserChangePasswordService
	session := sessions.Default(c)
	userUID := session.Get("user_uid")

	if err := c.ShouldBind(&service); err == nil {
		res := service.ChangePassword(userUID.(string))
		c.JSON(200, res)
	} else {
		c.JSON(200, ErrorResponse(err))
	}
}

// ChangeAvatar 用户修改头像接口
// @Summary 用户修改头像
// @Router /api/v1/user/resetPassword [put]
// @tags 用户相关
// @accept application/json
// @Param avatar query string true "用户头像"
// @Success 200 {string} json "{"status": 0, "data": {}, "msg": ""}"
func ChangeAvatar(c *gin.Context) {
	var service service.UserChangeAvatarService
	session := sessions.Default(c)
	userUID := session.Get("user_uid")

	if err := c.ShouldBind(&service); err == nil {
		res := service.ChangeAvatar(userUID.(string))
		c.JSON(200, res)
	} else {
		c.JSON(200, ErrorResponse(err))
	}
}

// ResetPassword 用户修改接口
// @Summary 用户修改
// @Router /api/v1/user/update [put]
// @tags 用户相关
// @accept application/json
// @Success 200 {string} json "{"status": 0, "data": {}, "msg": ""}"
func ResetPassword(c *gin.Context) {
	var service service.UserResetPasswordService
	if err := c.ShouldBind(&service); err == nil {
		res := service.ResetPassword(c.Param("id"))
		c.JSON(200, res)
	} else {
		c.JSON(200, ErrorResponse(err))
	}
}

// UserDelete 用户删除接口
// @Summary 用户删除
// @Router /api/v1/user/delete [delete]
// @tags 用户相关
// @accept application/json
// @Param id query string false "用户id"
// @Success 200 {string} json "{"status": 0, "data": {}, "msg": ""}"
func UserDelete(c *gin.Context) {
	var service service.UserDeleteService
	if err := c.ShouldBind(&service); err == nil {
		res := service.Delete(c.Param("id"))
		c.JSON(200, res)
	} else {
		c.JSON(200, ErrorResponse(err))
	}
}

// UserLogin 用户登录接口
// @Summary 用户登录
// @Router /api/v1/user/login [post]
// @tags 用户相关
// @accept application/json
// @Param user_name query string true "用户名"
// @Param password query string true "密码"
// @Success 200 {string} json "{"status": 0, "data": {}, "msg": ""}"
func UserLogin(c *gin.Context) {
	var service service.UserLoginService
	if err := c.ShouldBind(&service); err == nil {
		res := service.Login(c)
		c.JSON(200, res)
	} else {
		c.JSON(200, ErrorResponse(err))
	}
}

// UserInfo 用户详情
// @Summary 用户详情
// @Router /api/v1/user/info [get]
// @tags 用户相关
// @Success 200 {string} json "{"status": 0, "data": {}, "msg": ""}"
func UserInfo(c *gin.Context) {
	user := CurrentUser(c)
	res := serializer.BuildUserResponse(*user)
	c.JSON(200, res)
}

// UserList 用户列表
// @Summary 用户列表
// @Router /api/v1/user/list [get]
// @tags 用户相关
// @Success 200 {string} json "{"status": 0, "data": {}, "msg": ""}"
func UserList(c *gin.Context) {
	service := service.ListUserService{}
	if err := c.ShouldBind(&service); err == nil {
		res := service.UserList()
		c.JSON(200, res)
	} else {
		c.JSON(200, ErrorResponse(err))
	}
}

// UserLogout 用户登出
// @Summary 用户登出
// @Router /api/v1/user/logout [delete]
// @tags 用户相关
// @Success 200 {string} json "{"status": 0, "data": {}, "msg": ""}"
func UserLogout(c *gin.Context) {
	s := sessions.Default(c)
	s.Clear()
	s.Save()
	c.JSON(200, serializer.Response{
		Status: 0,
		Data:   true,
		Msg:    "登出成功",
	})
}

// UploadFile用户上传文件
func UploadFile(c *gin.Context) {
	file, fileHeader, _ := c.Request.FormFile("file")
	fileName := fileHeader.Filename
	fileSize := fileHeader.Size
	res := service.UploadFiletoQiniu(file, fileName, fileSize)
	c.JSON(200, res)
	// var service service.UploadFileService
	// if err := c.ShouldBind(&service); err == nil {
	// } else {
	// 	c.JSON(200, ErrorResponse(err))
	// }
}
